#include "rcc.h"

void myRCC_init(void)
{
    // 1. 取消之前配置的RCC，恢复初始状态
    RCC_DeInit();

    // 2. 产生主频
    // 2.1 开启HSE
    RCC_HSEConfig(RCC_HSE_ON);

    // 2.2 等待HSE稳定
    if(ERROR == RCC_WaitForHSEStartUp())
    {
        // 在等待时间内失败（未稳定）
        while(1)
        {
        }
    }

    // 2.3 配置PLL的参数(9倍频)
    RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);

    // 2.4 使能PLL
    RCC_PLLCmd(ENABLE);

    // 2.5 等待PLL稳定
    while(SET != RCC_GetFlagStatus(RCC_FLAG_PLLRDY))
    {}

    // 2.6 修改SYSCLK
    RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);

    // 2.7 等待SYSCLK稳定
    while(0x08 != RCC_GetSYSCLKSource())
    {}

    // 3. 使能FLASH的预读缓存，并设置为2周期
    FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
    FLASH_SetLatency(FLASH_Latency_2);

    // 4. 主频分发（时钟总线配置）
    // 4.1 SYSCLK / 1 = HCLK
    RCC_HCLKConfig(RCC_SYSCLK_Div1);
    // 4.2 外设时钟1，HCLK / 2 = PCLK1
    RCC_PCLK1Config(RCC_HCLK_Div2);
    // 4.3 外设时钟2，HCLK / 1 = PCLK2
    RCC_PCLK2Config(RCC_HCLK_Div1);
}
